home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap16 / ShowDib4 / ShowDib4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  8.0 KB  |  247 lines

  1. /*-------------------------------------------------------
  2.    SHOWDIB4.C -- Displays DIB with "all-purpose" palette
  3.                  (c) Charles Petzold, 1998
  4.   -------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "..\\ShowDib3\\PackeDib.h"
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("ShowDib4") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("Show DIB #4: All-Purpose Palette"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.      }
  53.      return msg.wParam ;
  54. }
  55.  
  56. /*------------------------------------------------------------------------
  57.    CreateAllPurposePalette: Creates a palette suitable for a wide variety
  58.           of images; the palette has 247 entries, but 15 of them are 
  59.           duplicates or match the standard 20 colors.
  60.   ------------------------------------------------------------------------*/
  61.  
  62. HPALETTE CreateAllPurposePalette (void)
  63. {
  64.      HPALETTE hPalette ;
  65.      int          i, incr, R, G, B ;
  66.      LOGPALETTE * plp ;
  67.  
  68.      plp = malloc (sizeof (LOGPALETTE) + 246 * sizeof (PALETTEENTRY)) ;
  69.  
  70.      plp->palVersion    = 0x0300 ;
  71.      plp->palNumEntries = 247 ;
  72.  
  73.           // The following loop calculates 31 gray shades, but 3 of them
  74.           //        will match the standard 20 colors
  75.  
  76.      for (i = 0, G = 0, incr = 8 ; G <= 0xFF ; i++, G += incr)
  77.      {
  78.           plp->palPalEntry[i].peRed   = (BYTE) G ;
  79.           plp->palPalEntry[i].peGreen = (BYTE) G ;
  80.           plp->palPalEntry[i].peBlue  = (BYTE) G ;
  81.           plp->palPalEntry[i].peFlags = 0 ;
  82.  
  83.           incr = (incr == 9 ? 8 : 9) ;
  84.      }
  85.  
  86.           // The following loop is responsible for 216 entries, but 8 of 
  87.           //        them will match the standard 20 colors, and another
  88.           //        4 of them will match the gray shades above.
  89.  
  90.      for (R = 0 ; R <= 0xFF ; R += 0x33)
  91.      for (G = 0 ; G <= 0xFF ; G += 0x33)
  92.      for (B = 0 ; B <= 0xFF ; B += 0x33)
  93.      {
  94.           plp->palPalEntry[i].peRed   = (BYTE) R ;
  95.           plp->palPalEntry[i].peGreen = (BYTE) G ;
  96.           plp->palPalEntry[i].peBlue  = (BYTE) B ;
  97.           plp->palPalEntry[i].peFlags = 0 ;
  98.  
  99.           i++ ;
  100.      }
  101.      hPalette = CreatePalette (plp) ;
  102.  
  103.      free (plp) ;
  104.      return hPalette ;
  105. }
  106.  
  107. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  108. {
  109.      static BITMAPINFO * pPackedDib ;
  110.      static HPALETTE     hPalette ;
  111.      static int          cxClient, cyClient ;
  112.      static OPENFILENAME ofn ;
  113.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  114.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  115.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  116.      HDC                 hdc ;
  117.      PAINTSTRUCT         ps ;
  118.  
  119.      switch (message)
  120.      {
  121.      case WM_CREATE:
  122.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  123.           ofn.hwndOwner         = hwnd ;
  124.           ofn.hInstance         = NULL ;
  125.           ofn.lpstrFilter       = szFilter ;
  126.           ofn.lpstrCustomFilter = NULL ;
  127.           ofn.nMaxCustFilter    = 0 ;
  128.           ofn.nFilterIndex      = 0 ;
  129.           ofn.lpstrFile         = szFileName ;
  130.           ofn.nMaxFile          = MAX_PATH ;
  131.           ofn.lpstrFileTitle    = szTitleName ;
  132.           ofn.nMaxFileTitle     = MAX_PATH ;
  133.           ofn.lpstrInitialDir   = NULL ;
  134.           ofn.lpstrTitle        = NULL ;
  135.           ofn.Flags             = 0 ;
  136.           ofn.nFileOffset       = 0 ;
  137.           ofn.nFileExtension    = 0 ;
  138.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  139.           ofn.lCustData         = 0 ;
  140.           ofn.lpfnHook          = NULL ;
  141.           ofn.lpTemplateName    = NULL ;
  142.  
  143.                // Create the All-Purpose Palette
  144.  
  145.           hPalette = CreateAllPurposePalette () ;
  146.           return 0 ;
  147.  
  148.      case WM_SIZE:
  149.           cxClient = LOWORD (lParam) ;
  150.           cyClient = HIWORD (lParam) ;
  151.           return 0 ;
  152.  
  153.      case WM_COMMAND:
  154.           switch (LOWORD (wParam))
  155.           {
  156.           case IDM_FILE_OPEN:
  157.  
  158.                     // Show the File Open dialog box
  159.  
  160.                if (!GetOpenFileName (&ofn))
  161.                     return 0 ;
  162.                
  163.                     // If there's an existing packed DIB, free the memory
  164.  
  165.                if (pPackedDib)
  166.                {
  167.                     free (pPackedDib) ;
  168.                     pPackedDib = NULL ;
  169.                }
  170.                
  171.                     // Load the packed DIB into memory
  172.  
  173.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  174.                ShowCursor (TRUE) ;
  175.  
  176.                pPackedDib = PackedDibLoad (szFileName) ;
  177.  
  178.                ShowCursor (FALSE) ;
  179.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  180.  
  181.                if (!pPackedDib)
  182.                {
  183.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  184.                                 szAppName, 0) ;
  185.                }
  186.                InvalidateRect (hwnd, NULL, TRUE) ;
  187.                return 0 ;
  188.           }
  189.           break ;
  190.  
  191.      case WM_PAINT:
  192.           hdc = BeginPaint (hwnd, &ps) ;
  193.  
  194.           if (pPackedDib)
  195.           {
  196.                SelectPalette (hdc, hPalette, FALSE) ;
  197.                RealizePalette (hdc) ;
  198.           
  199.                SetDIBitsToDevice (hdc, 
  200.                                   0,   
  201.                                   0,   
  202.                                   PackedDibGetWidth (pPackedDib), 
  203.                                   PackedDibGetHeight (pPackedDib),
  204.                                   0,                            
  205.                                   0,                            
  206.                                   0,                            
  207.                                   PackedDibGetHeight (pPackedDib),  
  208.                                   PackedDibGetBitsPtr (pPackedDib), 
  209.                                   pPackedDib, 
  210.                                   DIB_RGB_COLORS) ;
  211.           }
  212.           EndPaint (hwnd, &ps) ;
  213.           return 0 ;
  214.  
  215.      case WM_QUERYNEWPALETTE:
  216.           hdc = GetDC (hwnd) ;
  217.           SelectPalette (hdc, hPalette, FALSE) ;
  218.           RealizePalette (hdc) ;
  219.           InvalidateRect (hwnd, NULL, TRUE) ;
  220.  
  221.           ReleaseDC (hwnd, hdc) ;
  222.           return TRUE ;
  223.  
  224.      case WM_PALETTECHANGED:
  225.           if ((HWND) wParam != hwnd)
  226.  
  227.           hdc = GetDC (hwnd) ;
  228.           SelectPalette (hdc, hPalette, FALSE) ;
  229.           RealizePalette (hdc) ;
  230.           UpdateColors (hdc) ;
  231.  
  232.           ReleaseDC (hwnd, hdc) ;
  233.           break ;
  234.           
  235.      case WM_DESTROY:
  236.           if (pPackedDib)
  237.                free (pPackedDib) ;
  238.  
  239.           DeleteObject (hPalette) ;
  240.  
  241.           PostQuitMessage (0) ;
  242.           return 0 ;
  243.      }
  244.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  245. }
  246.  
  247.